﻿//#include "smc_room.hpp"
//#include "meet.hpp"
//#include "sqlite_conn.hpp"
//#include "serv_manage.hpp"
//
//#include "utils/utils_string.hpp"
//#include "ws_server.hpp"
//#include "wlog.hpp"
//#include "serv_manage.hpp"
//#include "utils/time.hpp"
//#include "meet_room.hpp"
//
//static set<int> success_code_set = {200,201,204};
//
//namespace bz {
//	smc_room::smc_room(asio::io_context& io, meet_room* room,meet* me, smc_client* smc, int meet_num, terminal* root_ter,bool is_main, bool auto_invite) :
//		AsioExecutor(io),
//		meet_(me),
//		smc_api_(smc),
//		is_ready_(false),
//		meet_room_(room),
//		is_all_see_chairman_(false),
//		is_main_(is_main),
//		meet_num_(meet_num),
//		root_ter_(root_ter),
//		shut_down_(false),
//		link_status_(true),
//		auto_invite_(auto_invite),
//		msg_count_(0)
//	{
//
//		real_access_code_ = "9" + to_string(meet_num_);
//		parent_room_ter_ = nullptr;
//	
//
//		excute_co(&smc_room::init, this);
//		excute_co(&smc_room::timer_check, this);
//	}
//
//	smc_room::~smc_room()
//	{
//		
//	}
//
//	void smc_room::before_del()
//	{
//		if(!conference_id_.empty())
//			smc_api_->unreg_ws_subscrible(conference_id_, this);
//		shut_down_ = true;
//	}
//
//	
//
//	async_simple::coro::Lazy<void> smc_room::init()
//	{
//		
//		terminal_list_.clear();
//		if (is_main_) {
//
//			for (auto& it : meet_room_->terminal_list_)
//			{
//				terminal_list_.push_back(it);
//			}
//			co_return;
//		}
//		else {
//			int index = 0;
//			for (auto& it : root_ter_->child_ter_)
//			{
//				if (index == 0) {
//					obj_id_ = it->obj_id;
//				}
//				++index;
//				terminal_list_.push_back(it);
//			}
//
//			parent_room_ter_ = new terminal();
//			parent_room_ter_->sip_uri = "9" + to_string(meet_->meet_num) + "@" + meet_room_->main_room_->smc_api_->host_;
//
//		}
//		
//
//		co_await async_simple::coro::sleep(3s);
//		co_await get_active_meet();
//
//		if (meet_room_->meet_->is_start && link_status_ && !conference_id_.empty() && room_index_ == 0) {
//
//			co_await enter_control();
//
//		}
//
//		if (conference_id_.empty() && auto_invite_) {
//			co_await start_meet();
//		}
//
//		/*if (!is_main_) {
//			co_await get_active_meet();
//		}*/
//		
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::timer_check()
//	{
//		uint32_t co = 1;
//		while (true)
//		{
//			co_await async_simple::coro::sleep(10s);
//			++co;
//			if (shut_down_) {
//				co_return;
//			}
//
//			excute_co(&smc_room::get_active_meet, this);
//
//			if (meet_room_->meet_->is_start && link_status_ && !conference_id_.empty() && room_index_ == 0) {
//				
//				co_await enter_control();
//				
//			}
//			else if (meet_room_->meet_->is_start && link_status_ && !conference_id_.empty()) {
//				co_await flush_meet_info();
//			}
//
//			if (co % 3 == 0) {
//				if (msg_count_ == 0) {
//					if (meet_room_->meet_->is_start && link_status_ && !conference_id_.empty()) {
//						if (conference_token_.empty())
//							co_await get_conference_token();
//
//						if (room_index_) {
//							co_await unsubscribe_room();
//						}
//
//						if (ter_index_) {
//							co_await unsubscribe_ter();
//						}
//
//						co_await subscribe_room();
//						co_await subscribe_ter();
//					}
//				}
//				else {
//					msg_count_ = 0;
//				}
//				
//			}
//		}
//		
//	}
//
//	
//
//
//	void smc_room::remove_ter(terminal* ter)
//	{
//		if (!is_main_) {
//			root_ter_->child_ter_.erase(std::remove(root_ter_->child_ter_.begin(), root_ter_->child_ter_.end(), ter), root_ter_->child_ter_.end());
//		}
//		
//		terminal_list_.erase(std::remove(terminal_list_.begin(), terminal_list_.end(), ter), terminal_list_.end());
//	}
//
//
//
//	async_simple::coro::Lazy<void> smc_room::get_conference_token()
//	{
//		if (conference_id_.empty()) co_return;
//		string uri = "/conf-portal/conferences/" + conference_id_ + "/token";
//		auto res_data = co_await smc_api_->get(uri);
//		smc_error_tips(res_data);
//		if (res_data.http_code == 200) {
//			conference_token_ = res_data.body;
//		}
//	}
//
//	async_simple::coro::Lazy<void> smc_room::enter_control()
//	{
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/conditions?page=0&size=200";
//		string detail_uri = "/conf-portal/online/conferences/" + conference_id_ + "/detail";
//
//
//		json params;
//		params["name"] = "";
//		params["showCurrentOrg"] = 1;
//
//		auto detail_res_data = co_await smc_api_->get(detail_uri);
//		auto res_data = co_await smc_api_->post(uri, params);
//		smc_error_tips(detail_res_data);
//		smc_error_tips(res_data);
//		parti_ids_set_.clear();
//		chairman_lock_ = false;
//		if (detail_res_data.status == 200 && res_data.status == 200) {
//
//			auto detail_json_body = json::parse(detail_res_data.body);
//			auto json_body = json::parse(res_data.body);
//
//			string chairmanId = detail_json_body["conferenceState"]["chairmanId"];
//			string currentSpokesmanId = detail_json_body["conferenceState"]["spokesmanId"];
//			chairman_ = chairmanId;
//
//
//			for (auto& it : json_body["content"])
//			{
//				string participant = it["generalParam"]["id"];
//				string sip_uri = it["generalParam"]["uri"];
//				bool online = it["state"]["online"];
//				bool mute = it["state"]["mute"];
//				parti_ids_set_.insert(participant);
//
//				if (parent_room_ter_ && utils_string::contains(parent_room_ter_->sip_uri, sip_uri)) {
//					parent_room_ter_->participant = participant;
//					parent_room_ter_->state = online ? meet_state::connected : meet_state::remove;
//					meet_room_->parti_terminal_map_[participant] = parent_room_ter_;
//					continue;
//				}
//
//				auto ter = meet_room_->uri_get_ter(sip_uri);
//				if (ter == nullptr) {	
//
//					for (auto it : terminal_list_)
//					{
//						auto pos = sip_uri.find(it->sip_uri);
//						if (pos != std::string::npos) {
//							ter = it;
//							break;
//						}
//					}
//
//				}
//
//
//
//
//
//				if (ter)
//				{
//					ter->participant = participant;
//
//					meet_room_->parti_terminal_map_[participant] = ter;
//
//				}
//				else
//				{
//					ter = new terminal();
//					ter->participant = participant;
//					ter->is_tmp = true;
//					ter->sip_uri = ter->ip = sip_uri;
//					ter->obj_id = participant;
//					ter->device_type = 2;
//					meet_room_->parti_terminal_map_[participant] = ter;
//					meet_room_->obj_terminal_map_[participant] = ter;
//
//					ter->name = it["generalParam"]["name"];
//
//
//					if (is_main_) {
//						ter->init_weight = ter->sort_weight = meet_room_->last_weight_;
//						meet_room_->last_weight_ -= 20;
//					}
//					else {
//						ter->init_weight = ter->sort_weight = root_ter_->child_last_weight;
//						root_ter_->child_last_weight -= 20;
//						ter->parent_ter_ = root_ter_;
//						ter->parent_obj = obj_id_;
//						ter->parent_id = root_ter_->id;
//						root_ter_->child_ter_.push_back(ter);
//					}
//
//
//					json ter_obj;
//					to_json(ter_obj, *ter);
//					meet_room_->push_ws_msg(ws_msg_type::participant_add, ter_obj);
//					terminal_list_.push_back(ter);
//				}
//				ter->audio_mute = mute;
//
//				if (ter->participant == currentSpokesmanId) {
//					ter->roll = true;
//				}
//				if (online) {
//					ter->state = meet_state::connected;
//				}
//				else {
//					ter->state = meet_state::remove;
//				}
//
//				if (ter->device_type == 1 && ter->child_ter_.size() > 0) {
//					ter->child_ter_[0]->link_state = ter->state;
//					meet_room_->ws_ter_update(ter->child_ter_[0]);
//				}
//
//				meet_room_->ws_ter_update(ter);
//
//			}
//
//			smc_api_->reg_ws_subscrible(conference_id_, this);
//
//			if (conference_token_.empty())
//				co_await get_conference_token();
//
//			co_await subscribe_room();
//			co_await subscribe_ter();
//
//		}
//
//	}
//
//	async_simple::coro::Lazy<void> smc_room::flush_meet_info()
//	{
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/conditions?page=0&size=200";
//		string detail_uri = "/conf-portal/online/conferences/" + conference_id_ + "/detail";
//
//
//		json params;
//		params["name"] = "";
//		params["showCurrentOrg"] = 1;
//
//		auto detail_res_data = co_await smc_api_->get(detail_uri);
//		auto res_data = co_await smc_api_->post(uri, params);
//		smc_error_tips(res_data);
//		smc_error_tips(detail_res_data);
//		if (detail_res_data.status == 200 && res_data.status == 200) {
//
//			auto detail_json_body = json::parse(detail_res_data.body);
//			auto json_body = json::parse(res_data.body);
//
//			string chairmanId = detail_json_body["conferenceState"]["chairmanId"];
//			string currentSpokesmanId = detail_json_body["conferenceState"]["spokesmanId"];
//			chairman_ = chairmanId;
//			spokesman_id_ = currentSpokesmanId;
//
//			for (auto& it : json_body["content"])
//			{
//				string participant = it["generalParam"]["id"];
//				string sip_uri = it["generalParam"]["uri"];
//				bool online = it["state"]["online"];
//				bool mute = it["state"]["mute"];
//				parti_ids_set_.insert(participant);
//
//				terminal* ter = nullptr;
//				if ((ter = meet_room_->par_get_ter(participant)) != nullptr) {
//
//
//					ter->audio_mute = mute;
//
//					if (ter->participant == currentSpokesmanId) {
//						ter->roll = true;
//					}
//					if (online) {
//						ter->state = meet_state::connected;
//					}
//					else {
//						ter->state = meet_state::remove;
//					}
//
//					meet_room_->ws_ter_update(ter);
//
//				}
//				else {
//
//					if (parent_room_ter_ && utils_string::contains(parent_room_ter_->sip_uri, sip_uri)) {
//						parent_room_ter_->participant = participant;
//						parent_room_ter_->state = online ? meet_state::connected : meet_state::remove;
//						meet_room_->parti_terminal_map_[participant] = parent_room_ter_;
//						continue;
//					}
//
//					ter = meet_room_->uri_get_ter(sip_uri);
//					if (ter == nullptr) {
//
//						for (auto it : terminal_list_)
//						{
//							auto pos = sip_uri.find(it->sip_uri);
//							if (pos != std::string::npos) {
//								ter = it;
//								break;
//							}
//						}
//
//					}
//
//
//
//
//
//					if (ter)
//					{
//						ter->participant = participant;
//
//						meet_room_->parti_terminal_map_[participant] = ter;
//
//					}
//					else
//					{
//						ter = new terminal();
//						ter->participant = participant;
//						ter->is_tmp = true;
//						ter->sip_uri = ter->ip = sip_uri;
//						ter->obj_id = participant;
//						ter->device_type = 2;
//						meet_room_->parti_terminal_map_[participant] = ter;
//						meet_room_->obj_terminal_map_[participant] = ter;
//
//						ter->name = it["generalParam"]["name"];
//						if (is_main_) {
//							ter->init_weight = ter->sort_weight = meet_room_->last_weight_;
//							meet_room_->last_weight_ -= 20;
//						}
//						else {
//							ter->init_weight = ter->sort_weight = root_ter_->child_last_weight;
//							root_ter_->child_last_weight -= 20;
//							ter->parent_ter_ = root_ter_;
//							ter->parent_obj = obj_id_;
//							ter->parent_id = root_ter_->id;
//							root_ter_->child_ter_.push_back(ter);
//						}
//
//						json ter_obj;
//						to_json(ter_obj, *ter);
//						meet_room_->push_ws_msg(ws_msg_type::participant_add, ter_obj);
//						terminal_list_.push_back(ter);
//					}
//					ter->audio_mute = mute;
//
//					if (ter->participant == currentSpokesmanId) {
//						ter->roll = true;
//					}
//					if (online) {
//						ter->state = meet_state::connected;
//					}
//					else {
//						ter->state = meet_state::remove;
//					}
//
//					if (ter->device_type == 1 && ter->child_ter_.size() > 0) {
//						ter->child_ter_[0]->link_state = ter->state;
//						meet_room_->ws_ter_update(ter->child_ter_[0]);
//					}
//
//					meet_room_->ws_ter_update(ter);
//
//
//
//				}
//
//
//
//				
//
//			}
//
//
//			if (spokesman_id_.empty())
//			{
//				for (auto& it : terminal_list_)
//				{
//					it->roll = false;
//					meet_room_->ws_ter_update(it);
//				}
//			}
//			else
//			{
//				for (auto& it : terminal_list_)
//				{
//					if (it->participant == spokesman_id_) {
//						it->roll = true;
//					}
//					else {
//						it->roll = false;
//					}
//					meet_room_->ws_ter_update(it);
//				}
//			}
//
//			
//
//		}
//	}
//
//	async_simple::coro::Lazy<void> smc_room::start_meet()
//	{
//		
//
//		if (!conference_id_.empty()) {
//			co_await enter_control();
//			co_return;
//		}
//
//		int rate = 2048;
//		switch (meet_room_->bind_width_)
//		{
//		case 1:
//			rate = 1024;
//			break;
//		case 2:
//			rate = 2048;
//			break;
//		case 3:
//			rate = 2880;
//			break;
//		case 4:
//			rate = 3840;
//			break;
//		case 5:
//			rate = 4800;
//			break;
//		case 6:
//			rate = 5760;
//			break;
//		default:
//			break;
//		}
//
//
//		string guestPassword;
//		if (is_main_) {
//			guestPassword = meet_->meet_pwd;
//		}
//		
//
//		WLOG << "meet_room_->bind_width_ = " << meet_room_->bind_width_;
//		json multiConferenceService = {
//			{"conferenceCapabilitySetting",{
//				{"amcRecord",false},
//				{"audioProtocol","AAC_LD_S"},
//				{"checkInDuration",10},
//				{"dataConfProtocol", "DATA_RESOLUTION_STANDARD"},
//				{"enableCheckIn", false},
//				{"enableDataConf", false},
//				{"enableFec", true},
//				{"enableLiveBroadcast", false},
//				{"enableHdRealTime", false},
//				{"mediaEncrypt", "AUTO_ENCRYPT_MODE"},
//				{"reserveResource", 0},
//				{"srcLang", "CHINESE"},
//				{"supportMinutes", false},
//				{"supportSubtitle", false},
//				{"svcRate", 3840},
//				{"svcVideoProtocol", "H265"},
//				{"svcVideoResolution", "MPI_1080P"},
//				{"type", "AVC"},
//				{"videoProtocol", "H264_BP"},
//				{"videoResolution", "MPI_1080P60"},
//				{"enableRecord", false},
//				{"enableLiveBroadcast", false},
//				{"rate", rate},
//			}},
//			{"conferencePolicySetting",{
//				{"autoEnd",true},
//				{"autoExtend",true},
//				{"autoMute",true},
//				{"chairmanPassword",""},
//				{"displaySubjectAsCallerDisplayInfo",true},
//				{"guestPassword",guestPassword},
//				{"language",1},
//				{"maxParticipantNum",500},
//				{"releaseParticipantRes",true},
//				{"voiceActive",false},
//
//			}}
//		};
//
//		json partipants = json::array();
//
//		if (is_main_) {
//			for (auto &it : meet_room_->obj_terminal_map_)
//			{
//				terminal* ter = it.second;
//
//				if (ter->parent_id == 0)
//				{
//					
//					string uuid = utils_string::generate_uuid();
//					json row = {
//						{"entryUuid",uuid},
//						{"ipProtocolType",ter->room_?"H323" : "SIP"},
//						{"mainParticipant",false},
//						{"mcuId",""},
//						{"mcuName","Auto"},
//						{"name",ter->name},
//						{"participantSourceType","NEW_CRETE"},
//						{"preChairman",ter->is_main},
//						{"rate",0},
//						{"serviceZoneId",""},
//						{"serviceZoneName","Auto"},
//						{"serviceZoneNameValue","Auto"},
//						{"terminalTypeIcon",""},
//						{"uri",ter->sip_uri},
//						{"uuid",uuid + ter->sip_uri},
//					};
//
//					partipants.push_back(row);
//				}
//			}
//		}
//		else {
//			for (auto& it : root_ter_->child_ter_)
//			{
//				terminal* ter = it;
//
//				
//				string uuid = utils_string::generate_uuid();
//				json row = {
//					{"entryUuid",uuid},
//					{"ipProtocolType","SIP"},
//					{"mainParticipant",false},
//					{"mcuId",""},
//					{"mcuName","Auto"},
//					{"name",ter->name},
//					{"participantSourceType","NEW_CRETE"},
//					{"preChairman",ter->is_main},
//					{"rate",0},
//					{"serviceZoneId",""},
//					{"serviceZoneName","Auto"},
//					{"serviceZoneNameValue","Auto"},
//					{"terminalTypeIcon",""},
//					{"uri",ter->sip_uri},
//					{"uuid",uuid + ter->sip_uri},
//				};
//
//				partipants.push_back(row);
//				
//			}
//		}
//
//		
//		string meet_name;
//		if (is_main_) {
//			meet_name = meet_->meet_name;
//		}
//		else {
//			meet_name = root_ter_->name;
//		}
//
//
//		json request_param = {
//			{"confPresetParam",{
//				{"presetMultiPics",json::array()}
//			}},
//			{"attendees",json::array()},
//			{"checkInService",{{"checkInDuration",10},{"enableCheckIn",false}}},
//			{"conference",{
//
//				{"conferenceTimeType","INSTANT_CONFERENCE"},
//				{"chairmanPassword",""},
//				{"duration",2147483647},
//				{"guestPassword",guestPassword},
//				{"scheduleStartTime",utils_time::getUtcTime()},
//				{"subject",meet_name},
//				{"vmrNumber",""},
//				{"accessCode",to_string(meet_num_)},
//			}
//			},
//			{"multiConferenceService",multiConferenceService},
//			{"subtitleService",{
//				{"enableSubtitle",false},
//				{"srcLang","CHINESE"}
//			}},
//			{"participants",partipants}
//
//
//		};
//
//		string uri = "/conf-portal/conferences";
//
//		auto http_res = co_await smc_api_->post(uri, request_param);
//
//		WLOG << "http_code=" << http_res.http_code;
//		smc_error_tips(http_res);
//
//		if (http_res.status == 201) {
//			auto json_body = json::parse(http_res.body);
//			conference_id_ = json_body["conference"]["id"];
//			co_await get_conference_token();
//			
//			WLOG << "body=" << json_body.dump(4);
//			
//			for (auto iter : json_body["participants"])
//			{
//				string parid = iter["id"];
//				parti_ids_set_.insert(parid);
//				string uri = iter["uri"];
//				auto ter_t = meet_room_->uri_get_ter(uri);
//				if (ter_t) {
//					ter_t->participant = parid;
//					meet_room_->parti_terminal_map_[parid] = ter_t;
//				}
//			}
//			smc_api_->reg_ws_subscrible(conference_id_, this);
//
//			
//		}
//
//		
//
//		
//		
//		co_return;
//	}
//
//	async_simple::coro::Lazy<bool> smc_room::end_meet()
//	{
//		co_await unsubscribe_room();
//		
//		smc_api_->unreg_ws_subscrible(conference_id_, this);
//		if (is_main_) {
//
//
//			string uri = "/conf-portal/online/conferences/" + conference_id_;
//
//			auto res_data = co_await smc_api_->del(uri);
//			smc_error_tips(res_data);
//			if (res_data.http_code == 204) {
//				co_await unsubscribe_ter();
//				conference_id_ = "";
//				conference_token_ = "";
//
//			}
//			co_return true;
//		}
//		else {
//			co_await unsubscribe_ter();
//			co_return true;
//		}
//	
//		
//
//		
//		
//	}
//
//	async_simple::coro::Lazy<void> smc_room::hand_all_sound(const bool mute)
//	{
//		if (is_main_) {
//			json hand = {
//				{"isMute",mute}
//			};
//
//			string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//
//			auto res_data = co_await smc_api_->patch(uri, hand);
//			smc_error_tips(res_data);
//		}
//		else {
//			for (auto it : terminal_list_)
//			{
//				if(it != parent_room_ter_ && it->participant != spokesman_id_)
//					set_audio_mute(it,true).via(coro_io::get_global_executor()).detach();
//			}
//		}
//		
//
//		co_return;
//	}
//
//
//	
//
//
//
//	void smc_room::on_ws_connect()
//	{
//		/*if (meet_->is_start) {
//			if (call_roster_index_ != 0) {
//				fme_api_->remove_ws_subscrible(call_roster_index_, call_info_index_);
//			}
//
//			auto ws_index = fme_api_->add_ws_subscrible(calls_, this);
//			call_roster_index_ = ws_index.first;
//			call_info_index_ = ws_index.second;
//		}*/
//	}
//
//	void smc_room::on_ws_close()
//	{
//		room_index_ = 0;
//		ter_index_ = 0;
//		real_index_ = 0;
//		//if (meet_->is_start) {
//		//	//timer_id_ = 0;
//		//	if (meet_->poll_state != 0) {
//		//		meet_->poll_state = 0;
//		//	}
//		//	fme_api_->remove_ws_subscrible(call_roster_index_, call_info_index_);
//		//	error_msg(error_no::mcu_offline);
//		//}
//		
//	}
//
//
//
//
//
//	
//
//
//	void smc_room::on_stages_info(json stages)
//	{
//		try
//		{
//			if (stages["stage"] == "ONLINE") {
//
//
//
//				excute_co(&smc_room::on_start, this);
//				//excute_co(&meet_room::on_start, meet_room_);
//			}
//			else if (stages["stage"] == "CANCEL") {
//				conference_id_ = "";
//			}
//		}
//		catch (const std::exception&)
//		{
//
//		}
//		
//	}
//
//	void smc_room::on_room_info(json body)
//	{
//		++msg_count_;
//		WLOG << "on_room_info smc="<< smc_api_->host_ <<" body =" << body.dump(4);
//		if (!meet_->is_start) return;
//		if (body.contains("state")) {
//			json state = body["state"];
//			spokesman_id_ = state["spokesmanId"];
//			string chairman = state["chairmanId"];
//			broadcast_id_ = state["broadcastId"];
//			multi_poll_status_ = state["multiPicPollStatus"];
//
//			if (!chairman.empty() && chairman_!= chairman) {
//				chairman_ = chairman;
//				excute_co(&smc_room::on_chairman_change, this);
//			}
//			chairman_ = chairman;
//
//			if (root_ter_ && !root_ter_->has_child_main && parent_room_ter_ && parent_room_ter_->state == meet_state::connected && chairman_ != parent_room_ter_->participant) {
//				excute_co(&smc_room::set_chariman, this, parent_room_ter_->participant);
//			}
//
//			if (spokesman_id_.empty())
//			{
//				for (auto &it : terminal_list_)
//				{
//					it->roll = false;
//					meet_room_->ws_ter_update(it);
//				}
//			}
//			else 
//			{
//				for (auto& it : terminal_list_)
//				{
//					if (it->participant == spokesman_id_) {
//						it->roll = true;
//					}
//					else {
//						it->roll = false;
//					}
//					meet_room_->ws_ter_update(it);
//				}
//			}
//
//			std::set<string> broadcast_list;
//			if (broadcast_id_ == "00000000-0000-0000-0000-000000000000")
//			{
//	
//				for (auto it : state["multiPicInfo"]["subPicList"])
//				{
//					string tmp = it["participantId"].get<string>();
//					if (!tmp.empty())
//						broadcast_list.insert(tmp);
//				}
//				
//
//				int picNum = state["multiPicInfo"]["picNum"];
//				int mode = state["multiPicInfo"]["mode"];
//
//				if (picNum == 1 && mode == 1 && !chairman_.empty() && multi_poll_status_ == "CANCEL") {
//					auto find_res = broadcast_list.find(chairman_);
//					if (find_res != broadcast_list.end()) {
//						is_all_see_chairman_ = true;
//					}
//					else {
//						is_all_see_chairman_ = false;
//					}
//				}
//
//				
//			}
//			else 
//			{
//				is_all_see_chairman_ = false;
//			}
//
//		}
//	}
//	
//	void smc_room::on_ter_info(json json_body)
//	{
//		++msg_count_;
//		WLOG << "on_ter_info:smc= " << smc_api_->host_ << " body =" << json_body.dump(4);
//		if (!meet_->is_start) return;
//		int type = json_body["type"];
//		string update_type = "participant_update";
//		switch (type)
//		{
//		case 1:
//			update_type = "participant_add";
//			break;
//		case 2:
//			update_type = "participant_remove";
//			break;
//		default:
//			break;
//		}
//		json changeList = json_body["changeList"];
//
//
//
//		if (type < 3) {
//			vector<string> parti_vec;
//			for (auto &it : changeList)
//			{
//				parti_vec.push_back(it["id"]);
//			}
//
//			excute_co(&smc_room::update_ter_sub, this, type, parti_vec);
//			//update_ter_sub(type, parti_vec);
//		}
//
//		if (type == 1) {
//			for (auto& it : changeList)
//			{
//				string participant = it["id"];
//				string sip_uri = it["uri"];
//
//				if (parent_room_ter_ && utils_string::contains(parent_room_ter_->sip_uri, sip_uri)) {
//					parent_room_ter_->participant = participant;
//					meet_room_->parti_terminal_map_[participant] = parent_room_ter_;
//					continue;
//				}
//
//				auto ter = meet_room_->par_get_ter(participant);
//				if (ter == nullptr) {
//					ter = meet_room_->uri_get_ter(sip_uri);
//					if (ter == nullptr) {
//						for (auto it : terminal_list_)
//						{
//							auto pos = sip_uri.find(it->sip_uri);
//							if (pos != std::string::npos) {
//								ter = it;
//								break;
//							}
//						}
//
//					}
//
//
//					if (ter && !ter->participant.empty()) {
//						meet_room_->parti_terminal_map_.erase(ter->participant);
//					}
//				}
//
//				if (ter) 
//				{
//					ter->participant = participant;
//					meet_room_->parti_terminal_map_[participant] = ter;
//
//					meet_room_->ws_ter_update(ter);
//				}
//				else 
//				{
//					terminal* ter = new terminal();
//					ter->participant = participant;
//					ter->is_tmp = true;
//					ter->sip_uri = ter->ip = sip_uri;
//					ter->obj_id = participant;
//					ter->device_type = 2;
//					meet_room_->parti_terminal_map_[participant] = ter;
//					meet_room_->obj_terminal_map_[participant] = ter;
//
//					ter->name = it["name"];
//
//					if (is_main_) {
//						ter->init_weight = ter->sort_weight = meet_room_->last_weight_;
//						meet_room_->last_weight_ -= 20;
//					}
//					else {
//						ter->init_weight = ter->sort_weight = root_ter_->child_last_weight;
//						root_ter_->child_last_weight -= 20;
//						ter->parent_ter_ = root_ter_;
//						ter->parent_obj = obj_id_;
//						ter->parent_id = root_ter_->id;
//						root_ter_->child_ter_.push_back(ter);
//					}
//
//					
//
//					json ter_obj;
//					to_json(ter_obj, *ter);
//					meet_room_->push_ws_msg(ws_msg_type::participant_add, ter_obj);
//					terminal_list_.push_back(ter);
//				}
//
//			
//			}
//		}
//		else if (type == 2) {
//			for (auto& it : changeList)
//			{
//				string participant = it["id"].get<string>();
//				/*if (choose_list_.count(tid)) {
//					choose_list_.erase(tid);
//					push_room_update();
//				}*/
//				terminal* ter = nullptr;
//				if ((ter = meet_room_->par_get_ter(participant)) != nullptr) {
//					ter->state = meet_state::remove;
//					ter->participant = "";
//					if (ter->is_tmp) {
//						//excute_co(&smc_room::del_terminal,this,ter);
//						json ter_obj;
//						to_json(ter_obj, *ter);
//						meet_room_->push_ws_msg(ws_msg_type::participant_remove, ter_obj);
//
//						terminal_list_.erase(std::remove(terminal_list_.begin(), terminal_list_.end(), ter), terminal_list_.end());
//						meet_room_->remove_ter(ter);
//					}
//					else {
//
//						ter->invite_time = 0;
//						meet_room_->parti_terminal_map_.erase(participant);
//
//						meet_room_->ws_ter_update(ter);
//					}
//				
//
//				}
//				
//			}
//		}
//		else {
//			for (auto& it : changeList)
//			{
//				string participant = it["participantId"];
//				terminal* ter = nullptr;
//				bool online = it["online"];
//
//				if ((ter = meet_room_->par_get_ter(participant)) != nullptr)
//				{
//					if (online) {
//						ter->state = meet_state::connected;
//					}
//					else {
//						ter->state = meet_state::remove;
//					}
//					
//					ter->audio_mute = it["mute"];
//
//					if (ter->is_main && chairman_ != ter->participant && online) {
//						excute_co(&smc_room::set_chariman,this, ter->participant);
//					}
//
//					if (ter->device_type == 1 && ter->child_ter_.size() > 0) {
//						ter->child_ter_[0]->link_state = ter->state;
//						meet_room_->ws_ter_update(ter->child_ter_[0]);
//					}
//					
//
//					meet_room_->ws_ter_update(ter);
//
//
//				}
//
//				/*if (!online) {
//					if (choose_list_.count(parti_id)) {
//						choose_list_.erase(parti_id);
//						push_room_update();
//					}
//				}*/
//
//
//				//it["onlineState"] = get_online_status(parti_id);
//				//update_ter_data(it["participantId"].get<string>(), it);
//			}
//		}
//	}
//
//	void smc_room::on_real_info(json json_body)
//	{
//		++msg_count_;
//		WLOG << "on_real_info:smc= " << smc_api_->host_ << " body =" << json_body.dump(4);
//		if (!meet_->is_start) return;
//		try
//		{
//			//json real_time_arr = json::array();
//
//			json real_json;
//
//			string participantId = json_body["participantId"];
//
//			terminal* ter = meet_room_->par_get_ter(participantId);
//			if (ter) {
//
//				real_json["name"] = ter->name;
//				real_json["sip_uri"] = ter->sip_uri;
//				real_json["realTimeInfo"] = json_body["realTimeInfo"];
//
//				meet_room_->push_ws_msg(ws_msg_type::real_time_info, real_json);
//			}
//
//
//
//		}
//		catch (const std::exception&)
//		{
//
//		}
//		
//
//		 
//	}
//
//
//	async_simple::coro::Lazy<void> smc_room::subscribe_ter()
//	{
//	
//		json participant_ids = json::array();
//
//		if (is_main_) {
//			for (auto &it : meet_room_->parti_terminal_map_)
//			{
//				terminal* ter = it.second;
//				if (ter->parent_id == 0) {
//
//					if (!ter->participant.empty())
//					{
//						participant_ids.push_back(ter->participant);
//					}
//
//				}
//				
//			}
//		}
//		else {
//			for (auto &it : root_ter_->child_ter_)
//			{
//				terminal* ter = it;
//				if (!ter->participant.empty())
//				{
//					participant_ids.push_back(ter->participant);
//				}
//			}
//		}
//
//		
//
//		ter_sub_id_ = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
//
//		
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/groups/" + to_string(ter_sub_id_);
//
//		int page_size = 200;
//		if (participant_ids.size() == 0) page_size = 10;
//
//		json tmp_arr = { {"pageSize",page_size},{"participants",participant_ids} };
//
//		auto res_data =co_await smc_api_->post(uri, tmp_arr);
//		smc_error_tips(res_data);
//		if (res_data.http_code == 204) {
//
//			ter_index_ = smc_api_->get_sub_index();
//			
//			string msg_body = "SUBSCRIBE\n"
//				"token:" + conference_token_ + "\n"
//				"id:sub-" + to_string(ter_index_) + "\n"
//				"destination:/topic/conferences/" + conference_id_ + "/participants/groups/" + to_string(ter_sub_id_) + "\n\n";
//			WLOG << "send msg=" << msg_body;
//			smc_api_->send_ws(msg_body);
//
//		}
//		else {
//			
//		}
//
//	}
//
//	async_simple::coro::Lazy<void> smc_room::update_ter_sub(int type, vector<string> parti_ids)
//	{
//		if (type == 1) {
//			for (auto it : parti_ids)
//			{
//				auto find_res = parti_ids_set_.find(it);
//				if (find_res == parti_ids_set_.end()) {
//					parti_ids_set_.insert(it);
//				}
//			}
//		}
//		else {
//			for (auto it : parti_ids)
//			{
//				auto find_res = parti_ids_set_.find(it);
//				if (find_res != parti_ids_set_.end()) {
//					parti_ids_set_.erase(find_res);
//				}
//			}
//		}
//
//		json participant_ids = json::array();
//
//		for (auto it : parti_ids_set_)
//		{
//			participant_ids.push_back(it);
//		}
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/groups/" + to_string(ter_sub_id_);
//
//		json param = { {"pageSize",200},{"participants",participant_ids} };
//
//		auto res_data = co_await smc_api_->post(uri, param);
//		smc_error_tips(res_data);
//
//		WLOG << "update_ter_sub param="<< param.dump(4)<<"http_code :" << res_data.http_code;
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::subscribe_room()
//	{
//
//		room_index_ = smc_api_->get_sub_index();
//		string msg_body = "SUBSCRIBE\n"
//			"token:" + conference_token_ + "\n"
//			"id:sub-" + to_string(room_index_) + "\n"
//			"destination:/topic/conferences/" + conference_id_ + "\n\n";
//
//		smc_api_->send_ws(msg_body);
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::unsubscribe_room()
//	{
//		if (room_index_) {
//			string msg_body = "UNSUBSCRIBE\n"
//				"id:sub-" + to_string(room_index_) + "\n\n";
//			smc_api_->send_ws(msg_body);
//
//			room_index_ = 0;
//		}
//		
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::unsubscribe_ter()
//	{
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/groups/" + to_string(ter_sub_id_);
//
//		auto res_data = co_await smc_api_->del(uri);
//
//		if (res_data.http_code == 204) {
//			string msg_body = "UNSUBSCRIBE\n"
//				"id:sub-" + to_string(ter_index_) + "\n\n";
//			WLOG << "send msg=" << msg_body;
//			smc_api_->send_ws(msg_body);
//			ter_index_ = 0;
//		}
//	}
//
//
//
//	async_simple::coro::Lazy<bool> smc_room::roll(terminal* ter)
//	{
//		
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//
//		json params;
//		params["spokesman"] = ter->participant;
//
//		auto res_data = co_await smc_api_->patch(uri, params);
//		smc_error_tips(res_data);
//		if (res_data.status == 204) {
//			for (auto it : meet_room_->obj_terminal_map_)
//			{
//				it.second->choose = false;
//				it.second->is_poll = false;
//				if (it.second != ter) {
//					meet_room_->ws_ter_update(it.second);
//				}
//			}
//
//			co_await set_ter_see_chairman(ter);
//			co_return true;
//		}
//		else {
//			co_return false;
//		}
//
//	}
//
//	
//
//
//	async_simple::coro::Lazy<void> smc_room::set_default()
//	{
//
//		if (!spokesman_id_.empty()) {
//
//			co_await set_spokesman_mute();
//
//			string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//			json params;
//			params["spokesman"] = "";
//			auto res_data = co_await smc_api_->patch(uri, params);
//
//			smc_error_tips(res_data);
//		}
//		co_await choose_first();
//
//		co_await hand_all_sound(true);
//
//		for (auto it : terminal_list_)
//		{
//			if (it->state == meet_state::connected) {
//				it->is_poll = false;
//				it->choose = false;
//				meet_room_->ws_ter_update(it);
//			}
//		}
//
//		co_await set_all_see_chairman();
//
//		
//
//		co_return;
//
//	}
//
//	async_simple::coro::Lazy<bool> smc_room::choose(terminal* ter, bool is_poll)
//	{
//		if (!spokesman_id_.empty()) {
//			co_await lock_chairman_video(true);
//
//			co_await set_spokesman_mute();
//		}
//		co_await set_all_see_chairman();
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" +chairman_ + "/status";
//		json params;
//
//		json multiPicInfo = {
//						{"mode",1},
//						{"picNum",1},
//						{"subPicList",{ 
//								{
//									{"participantId",ter->participant },
//									{"streamNumber",0},
//									{"vas",false}
//								} 
//							}
//						}
//		};
//		params["multiPicInfo"] = multiPicInfo;
//		auto res_data = co_await smc_api_->patch(uri, params);
//		smc_error_tips(res_data);
//		if (res_data.http_code == 204) {
//
//			
//			for (auto it: terminal_list_)
//			{
//				if (it != ter) {
//					it->choose = false;
//					it->is_poll = false;
//					meet_room_->ws_ter_update(it);
//				}
//			}
//
//			if (ter->is_mcu) {
//				co_return true;
//			}
//
//			if (is_poll) {
//				ter->is_poll = true;
//				ter->choose = false;
//			}
//			else {
//				ter->choose = true;
//				ter->is_poll = false;
//			}
//			
//			meet_room_->ws_ter_update(ter);
//			co_return true;
//		}
//		else {
//			WLOG << "res_data error" << res_data.body;
//			meet_room_->smc_error(res_data.body);
//		}
//
//
//
//		co_return false;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::cancel_choose(terminal* ter)
//	{
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::invite_device(terminal* ter)
//	{
//		if (!link_status_) co_return;
//
//		if (ter->participant.empty()) {
//			string url = "/conf-portal/online/conferences/" + conference_id_ + "/participants";
//			json param = {
//				{
//					{"audioProtocolValue","Auto"},
//					{"dialModeValue","Auto"},
//					{"dtmfInfo",""},
//					{"ipProtocolType",ter->room_?"H323":"SIP"},
//					{"name",ter->name},
//					{"participantSourceType","NEW_CRETE"},
//					{"rate",0},
//					{"rateValue","Auto"},
//					{"serviceZoneNameValue","Auto"},
//					{"terminalType","Auto"},
//					{"uri",ter->sip_uri},
//					{"videoProtocolValue","Auto"},
//					{"videoResolutionValue","Auto"}
//				}
//			};
//
//			auto res_data = co_await smc_api_->post(url, param);
//			smc_error_tips(res_data);
//		}
//		else {
//
//			json hand = {
//				{"isOnline",true}
//			};
//
//			string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + ter->participant + "/status";
//
//			auto res_data = co_await smc_api_->patch(uri, hand);
//		}
//
//		
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::set_audio_mute(terminal* ter, bool mute)
//	{
//		json hand = { 
//			{"isMute",mute} 
//		};
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + ter->participant + "/status";
//
//		auto res_data = co_await smc_api_->patch(uri, hand);
//		smc_error_tips(res_data);
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::hungup_device(terminal* ter)
//	{
//
//		ter->roll = false;
//		ter->choose = false;
//		ter->audio_mute = true;
//		ter->is_active_hungup = true;
//
//		json hand = {
//			{"isOnline",false}
//		};
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + ter->participant + "/status";
//
//		auto res_data = co_await smc_api_->patch(uri, hand);
//		smc_error_tips(res_data);
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::del_terminal(terminal* ter)
//	{
//		if (!ter->participant.empty()) {
//			json terminal_list = {
//				ter->participant
//			};
//			string url = "/conf-portal/online/conferences/" + conference_id_ + "/participants";
//
//
//			auto res_data = co_await smc_api_->del(url, terminal_list);
//
//			smc_error_tips(res_data);
//		}
//		
//	}
//
//	async_simple::coro::Lazy<void> smc_room::lock_chairman_video(bool lock)
//	{
//		if (chairman_lock_ == lock) co_return;
//
//		if (!chairman_.empty()) {
//			string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + chairman_ + "/status";
//
//			json param = {
//				{"videoSwitchAttribute", lock ? "CUSTOMIZED" : "AUTO"}
//			};
//			auto http_res = co_await smc_api_->patch(uri, param);
//
//			smc_error_tips(http_res);
//			if (http_res.http_code == 204) {
//
//				chairman_lock_ = lock;
//				co_return;
//			}
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::set_spokesman_mute()
//	{
//		if (spokesman_id_ == chairman_) co_return;
//
//		if (is_main_) {
//			if (!spokesman_id_.empty()) {
//				string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + spokesman_id_ + "/status";
//				json request_param = {
//					{"isMute", true}
//				};
//				auto res_data = co_await smc_api_->patch(uri, request_param);
//				smc_error_tips(res_data);
//			}
//		}
//		else {
//			if (!spokesman_id_.empty() && parent_room_ter_ && parent_room_ter_->participant != spokesman_id_) {
//				string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + spokesman_id_ + "/status";
//				json request_param = {
//					{"isMute", true}
//				};
//				auto res_data = co_await smc_api_->patch(uri, request_param);
//
//				smc_error_tips(res_data);
//			}
//		}
//		
//
//	}
//
//	async_simple::coro::Lazy<void> smc_room::set_all_see_chairman()
//	{
//		if (is_all_see_chairman_) co_return;
//
//		co_await lock_chairman_video(true);
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//		json multi_pic_info = {
//			{"mode",1},
//			{"picNum",1},
//			{"subPicList",{
//					{
//						{"participantId",chairman_},
//						{"streamNumber",0},
//						{"vas",false}
//					}
//				}
//			}
//		};
//		json param = {
//			{"multiPicInfo",multi_pic_info},
//
//		};
//		auto set_res = co_await smc_api_->patch(uri, param);
//		smc_error_tips(set_res);
//		if (set_res.http_code == 204) {
//			co_await broadcast_muti();
//			is_all_see_chairman_ = true;
//			co_await lock_chairman_video(false);
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::broadcast_muti()
//	{
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//		json request_param = {
//			{"broadcaster","00000000-0000-0000-0000-000000000000"}
//		};
//		auto res_data = co_await smc_api_->patch(uri, request_param);
//		smc_error_tips(res_data);
//		co_return;
//		
//	}
//
//	async_simple::coro::Lazy<void> smc_room::set_chariman(string chairman)
//	{
//		string old_chairman = chairman_;
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//		json params;
//		params["chairman"] = chairman;
//		auto res_data =co_await smc_api_->patch(uri, params);
//		smc_error_tips(res_data);
//		if (res_data.status == 204) {
//
//			set_spokesman_mute();
//
//
//			//choose_first(chairman);
//			if (is_main_) {
//				if (!old_chairman.empty()) {
//					string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + old_chairman + "/status";
//					json request_param = {
//						{"isMute", true}
//					};
//					res_data = co_await smc_api_->patch(uri, request_param);
//					smc_error_tips(res_data);
//				}
//			}
//			else {
//				if (!old_chairman.empty() && parent_room_ter_ && old_chairman != parent_room_ter_->participant) {
//					string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + old_chairman + "/status";
//					json request_param = {
//						{"isMute", true}
//					};
//					res_data = co_await smc_api_->patch(uri, request_param);
//					smc_error_tips(res_data);
//				}
//			}
//			
//			
//		}
//
//	}
//
//	async_simple::coro::Lazy<void> smc_room::on_start()
//	{
//		if (conference_token_.empty())
//			co_await get_conference_token();
//
//		co_await subscribe_room();
//		co_await subscribe_ter();
//		co_await meet_room_->on_start(this);
//		
//		
//	}
//
//	async_simple::coro::Lazy<void> smc_room::set_ter_see_chairman(terminal* ter)
//	{
//		if (!chairman_.empty()) {
//
//			json multi_pic_info = {
//				{"mode",1},
//				{"picNum",1},
//				{"subPicList",{
//						{
//							{"participantId",chairman_},
//							{"streamNumber",0},
//							{"vas",false}
//						}
//					}
//				}
//			};
//			json param = {
//				{"multiPicInfo",multi_pic_info},
//
//			};
//			string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + ter->participant + "/status";
//			auto set_res =co_await smc_api_->patch(uri, param);
//			smc_error_tips(set_res);
//			if (set_res.status == 204) {
//				co_return;
//			}
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::choose_first()
//	{
//		terminal* ter = nullptr;
//		for (auto it : terminal_list_)
//		{
//			if (it->state == meet_state::connected && !it->is_main) {
//				ter = it;
//				break;
//			}
//		}
//
//		if (!ter || chairman_.empty()) co_return;
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + chairman_ + "/status";
//		json params;
//
//		json multiPicInfo = {
//						{"mode",1},
//						{"picNum",1},
//						{"subPicList",{
//								{
//									{"participantId",ter->participant },
//									{"streamNumber",0},
//									{"vas",false}
//								}
//							}
//						}
//		};
//		params["multiPicInfo"] = multiPicInfo;
//		auto res_data = co_await smc_api_->patch(uri, params);
//		smc_error_tips(res_data);
//		if (res_data.http_code == 204) {
//			if (is_main_) {
//				for (auto it : terminal_list_)
//				{
//					if (ter != it) {
//						it->choose = false;
//						it->is_poll = false;
//					}
//					else {
//						it->choose = true;
//						it->is_poll = false;
//					}
//					meet_room_->ws_ter_update(ter);
//
//				}
//			}
//			
//		}
//	}
//
//
//	async_simple::coro::Lazy<string> smc_room::get_active_meet()
//	{
//		string uri = "/conf-portal/conferences/conditions?page=0&size=200";
//		json params;
//
//
//		
//		params["keyword"] = "";
//		params["organizationId"] = "";
//		params["showCurrentOrg"] = 1;
//		params["startTime"] = "";
//		params["endTime"] = "";
//		params["active"] = true;
//		string conference_id;
//
//		auto res_data =co_await smc_api_->post(uri, params);
//		smc_error_tips(res_data);
//		if (res_data.status == 200) {
//			try
//			{
//				auto json_body = json::parse(res_data.body);
//				for (auto& it : json_body["content"])
//				{
//					string accessCode = it["accessCode"];
//					if (accessCode == real_access_code_) {
//						conference_id_ = conference_id = it["id"];
//						co_return conference_id;
//					}
//				}
//			}
//			catch (const std::exception&)
//			{
//
//			}
//			
//		}
//
//		co_return conference_id;
//	}
//
//	async_simple::coro::Lazy<bool> smc_room::change_layout(int picNum, vector<string>& parti_vec)
//	{
//		co_await set_all_see_chairman();
//		json multiPicInfo = {
//			{"mode",1},
//			{"picNum",picNum},
//		};
//
//		json subPicList = json::array();
//		
//		for (auto& it : parti_vec)
//		{
//			json row = {
//				{"participantId",it},
//				{"streamNumber",0},
//				{"vas",false},
//			};
//
//			subPicList.push_back(row);
//		}
//
//		multiPicInfo["subPicList"] = subPicList;
//
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + chairman_ + "/status";
//		json params;
//
//		params["multiPicInfo"] = multiPicInfo;
//		auto res_data = co_await smc_api_->patch(uri, params);
//		smc_error_tips(res_data);
//		if (res_data.http_code == 204) {
//			for (auto& it : parti_vec)
//			{
//				terminal* ter = meet_room_->par_get_ter(it);
//				if (ter) {
//					ter->choose = false;
//					ter->is_poll = true;
//					meet_room_->ws_ter_update(ter);
//				}
//			}
//			co_return true;
//		}
//
//		co_return false;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::subscribe_terminal_detail(string parti)
//	{
//		int64_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
//		sub_time_ = now;
//
//		json participant_ids = json::array();
//		participant_ids.push_back(parti);
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/groups/" + to_string(sub_time_) + "/realTimeInfo";
//
//		auto res_data = co_await smc_api_->post(uri, participant_ids);
//		smc_error_tips(res_data);
//		if (res_data.status == 204) {
//			real_index_ = smc_api_->get_sub_index();
//
//			string msg_body = "SUBSCRIBE\n"
//				"token:" + conference_token_ + "\n"
//				"id:sub-" + to_string(real_index_) + "\n"
//				"destination:/topic/conferences/" + conference_id_ + "/participants/groups/" + to_string(sub_time_) + "/realTimeInfo\n\n";
//			smc_api_->send_ws(msg_body);
//
//		}
//		else {
//
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::unsubscribe_terminal_detail()
//	{
//		if (real_index_ == 0) co_return;
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/groups/" + to_string(sub_time_);
//
//		auto res_data = co_await smc_api_->del(uri);
//		smc_error_tips(res_data);
//		if (res_data.status == 204) {
//			string msg_body = "UNSUBSCRIBE\n"
//				"id:sub-" + to_string(real_index_) + "\n\n";
//			WLOG << "send msg=" << msg_body;
//			smc_api_->send_ws(msg_body);
//			real_index_ = 0;
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::hungup_link()
//	{
//		if(parent_room_ter_)
//			parent_room_ter_->state =  meet_state::remove;
//
//		link_status_ = false;
//		co_await unsubscribe_room();
//		co_await unsubscribe_ter();
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::recall_link()
//	{
//		link_status_ = true;
//		if (!conference_id_.empty()) {
//			co_await enter_control();
//		}
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::camera_control(terminal* ter, string cmd)
//	{
//
//		string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + ter->participant + "/camera";
//
//		json operate_data;
//		operate_data["number"] = 1;
//		
//		if (cmd == "set_pantilt_up") {
//			operate_data["controlType"] = 11;
//			operate_data["operate"] = 1;
//		}
//		else if (cmd == "set_pantilt_up_stop") {
//			operate_data["controlType"] = 11;
//			operate_data["operate"] = 3;
//		}
//		else if (cmd == "set_pantilt_right") {
//			operate_data["controlType"] = 14;
//			operate_data["operate"] = 1;
//		}
//		else if (cmd == "set_pantilt_right_stop") {
//			operate_data["controlType"] = 14;
//			operate_data["operate"] = 3;
//		}
//		else if (cmd == "set_pantilt_down") {
//			operate_data["controlType"] = 12;
//			operate_data["operate"] = 1;
//		}
//		else if (cmd == "set_pantilt_down_stop") {
//			operate_data["controlType"] = 12;
//			operate_data["operate"] = 3;
//		}
//		else if (cmd == "set_pantilt_left") {
//			operate_data["controlType"] = 13;
//			operate_data["operate"] = 1;
//		}
//		else if (cmd == "set_pantilt_left_stop") {
//			operate_data["controlType"] = 13;
//			operate_data["operate"] = 3;
//		}
//		else if (cmd == "set_zoom_tele") {
//			operate_data["controlType"] = 16;
//			operate_data["operate"] = 1;
//		}
//		else if (cmd == "set_zoom_tele_stop") {
//			operate_data["controlType"] = 16;
//			operate_data["operate"] = 3;
//		}
//		else if (cmd == "set_zoom_wide") {
//			operate_data["controlType"] = 15;
//			operate_data["operate"] = 1;
//		}
//		else if (cmd == "set_zoom_wide_stop") {
//			operate_data["controlType"] = 15;
//			operate_data["operate"] = 3;
//		}
//
//		auto res_data = co_await smc_api_->post(uri, operate_data);
//
//		if (res_data.status != 204) {
//			meet_room_->smc_error(res_data.body);
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::set_chairman(terminal* ter)
//	{
//		co_await set_chariman(ter->participant);
//		
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::on_chairman_change()
//	{
//		is_all_see_chairman_ = false;
//		co_await set_all_see_chairman();
//		if (is_main_) {
//			co_await choose_first();
//		}
//	}
//
//	async_simple::coro::Lazy<void> smc_room::choose_parent()
//	{
//		if (parent_room_ter_ && !parent_room_ter_->participant.empty()) {
//			string uri = "/conf-portal/online/conferences/" + conference_id_ + "/participants/" + chairman_ + "/status";
//			json params;
//
//			json multiPicInfo = {
//							{"mode",1},
//							{"picNum",1},
//							{"subPicList",{
//									{
//										{"participantId",parent_room_ter_->participant },
//										{"streamNumber",0},
//										{"vas",false}
//									}
//								}
//							}
//			};
//			params["multiPicInfo"] = multiPicInfo;
//			auto res_data = co_await smc_api_->patch(uri, params);
//			smc_error_tips(res_data);
//		}
//
//		for (auto it :  terminal_list_)
//		{
//			it->choose = false;
//			it->is_poll = false;
//			meet_room_->ws_ter_update(it);
//
//		}
//
//		co_return;
//	}
//
//	async_simple::coro::Lazy<void> smc_room::cancel_roll()
//	{
//		if (is_main_) {
//			if (!spokesman_id_.empty()) {
//				co_await set_spokesman_mute();
//				string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//				json params;
//				params["spokesman"] = "";
//				auto res_data = co_await smc_api_->patch(uri, params);
//				smc_error_tips(res_data);
//			}
//		}
//		else {
//
//			if (!spokesman_id_.empty()) {
//				
//				if(parent_room_ter_  && spokesman_id_ != parent_room_ter_->participant)
//					co_await set_spokesman_mute();
//
//				string uri = "/conf-portal/online/conferences/" + conference_id_ + "/status";
//				json params;
//				params["spokesman"] = "";
//				auto res_data = co_await smc_api_->patch(uri, params);
//				smc_error_tips(res_data);
//			}
//
//
//		}
//
//		
//		co_return;
//	}
//
//	
//
//	
//
//	void smc_room::smc_error_tips(api_res& rep)
//	{
//		if (!success_code_set.count(rep.http_code)) {
//			meet_room_->smc_error(rep.body);
//		}
//	}
//	
//
//
//	
//}